package com.fare.taluo.core.domain.queue.warn;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.time.DateFormatUtils;

import com.fare.taluo.GlobalsConst;
import com.fare.taluo.core.domain.analyse.alert.FreightPriceAnalyseAlertConfigEntity;
import com.fare.taluo.core.domain.freightprice.FreightFlightDayEntity;
import com.fare.taluo.core.domain.freightprice.FreightFlightEntity;
import com.fare.taluo.core.domain.freightprice.FreightFlightSellerEntity;
import com.fare.taluo.util.value.NumberUtils;
import com.fare.taluo.vo.core.PlaneInfo;
import com.fare.taluo.vo.core.report.FreightPriceAlertVO;

/**
 * 单独一个类出来，做运价预警策略运算
 * <br/>策略多的时候再去重构
 * @author creator: xiangsf
 * @author modifior: xiangsf
 * @since 2012-12-26-上午9:34:19
 * @version v1.0
 */
public class FreightPriceWarnStrategy {

	private FreightPriceAnalyseAlertConfigEntity config;
	
	public FreightPriceWarnStrategy(FreightPriceAnalyseAlertConfigEntity config){
		this.config = config;
	}
	
	/** 
	 * 策略计算得出预警信息
	 * 有效期当天每次抓取的目标航线最低价（当天及未来N天，E中设置），最低价是我航的天数在触发条件范围时，发送邮件至用户设置的邮箱。
	 * 得出外航符合预警的运价数据，组装出用户想要的预警信息返回
	 * @param list 某航段的所有航空公司的运价数据
	 * @return 
	 */
//	public List<PlaneInfo> getAlertVO(List<FreightFlightEntity> list){
//		return null;
//	}
	  
	
	/**
	 * 策略计算得出预警信息
	 * <p>将list中本航空公司与外航公司运价数据作对比，得出外航符合预警的运价数据，组装出用户想要的预警信息返回
	 * @param list 某航段的所有航空公司的运价数据
	 * @return
	 */
	public List<FreightPriceAlertVO> getAlertVO(List<FreightFlightEntity> list){
		List<FreightPriceAlertVO> alertVos = new ArrayList<FreightPriceAlertVO>();
		List<FreightFlightEntity> tempEntitys = this.getInnerCarrierList(list);
		List<FreightFlightEntity> outerEntitys = null;
		//FreightPriceAlertVO vo = null;
		for(FreightFlightEntity e : tempEntitys){
			outerEntitys = this.getOuterCarrierList(list);
			outerEntitys = this.getSpreadThanEntitys(config, e, outerEntitys);
			for(FreightFlightEntity e1 : outerEntitys){
				
				alertVos.add(this.createAlertVo(e, e1));
			}
		}
		return alertVos;
	}
	/**
	 * 根据配置策略比，获得符合条件的外航运价数据
	 * @param config
	 * @param srcEntity
	 * @param list
	 * @return
	 */
	protected List<FreightFlightEntity> getSpreadThanEntitys(FreightPriceAnalyseAlertConfigEntity config,FreightFlightEntity srcEntity, List<FreightFlightEntity> list){
		List<FreightFlightEntity> finalEntitys = new ArrayList<FreightFlightEntity>(); 
		//config.getSpreadThan() 为负值时，是低于南航价，为正值时是高于南航价
		Double spreadThanValue = NumberUtils.mul(srcEntity.getDefaultPrice(), NumberUtils.div(100+config.getSpreadThan(), 100, 2));
		for(FreightFlightEntity e : list){
			//低于百分比，则是拿当前价格与差价相比要小于等于，才是符合条件的预警
			//高于百分比，要大于等于
			//如：比南航价低30%，则深航等价格要比南航价乘以70%后还要低，才是符合条件的预警
			if((config.getSpreadThan() <= 0 && e.getDefaultPrice() <= spreadThanValue)
					|| (config.getSpreadThan() >= 0 && e.getDefaultPrice() >= spreadThanValue)){
				finalEntitys.add(e);
			}
		}
		return finalEntitys;
	}
	/**
	 * 创建预警对象
	 * @param e
	 * @param e1
	 * @return
	 */
	private FreightPriceAlertVO createAlertVo(FreightFlightEntity e, FreightFlightEntity e1){
		FreightFlightDayEntity thisEntity = (FreightFlightDayEntity)e;
		FreightFlightSellerEntity proxyEntity = (FreightFlightSellerEntity)e1;
		FreightPriceAlertVO vo = new FreightPriceAlertVO();
		vo.setCarrierName(thisEntity.getCarrierName());
		vo.setFlightDate(thisEntity.getFlightDate());
		vo.setFlightLeg(thisEntity.getFromCity()+GlobalsConst.SEPARATOR_LINE+thisEntity.getToCity());
		vo.setProxyName(proxyEntity.getCarrierName());
		vo.setProxyLowerPrice(proxyEntity.getDefaultPrice());
		vo.setCarrierName(proxyEntity.getCarrierName());
		vo.setLowerPrice(thisEntity.getDefaultPrice());
		vo.setChannelName(proxyEntity.getSeller());
		vo.setSpreadThan(NumberUtils.div((thisEntity.getDefaultPrice()-proxyEntity.getDefaultPrice())*100, thisEntity.getDefaultPrice(), 2));
		return vo;
	}
	/**
	 * 获得本公司的运价数据
	 * @param list
	 * @return
	 */
	protected List<FreightFlightEntity> getInnerCarrierList(List<FreightFlightEntity> list){
		List<FreightFlightEntity> values = new ArrayList<FreightFlightEntity>();
		for(FreightFlightEntity e : list){//中国南方航空公司的价格对象
			if(GlobalsConst.PROJECT_INNER_COMPANY_CODE.equalsIgnoreCase(e.getCarrierName())){
				values.add(e);
			}
		}
		return values;
	}
	/**
	 * 获得外航航空公司的运价数据
	 * @param list
	 * @return
	 */
	protected List<FreightFlightEntity> getOuterCarrierList(List<FreightFlightEntity> list){
		//与南航同一航线的所有外航价格对象
		List<FreightFlightEntity> values = new ArrayList<FreightFlightEntity>();
		for(FreightFlightEntity e : list){ //所有外航的价格对象
			if(!GlobalsConst.PROJECT_INNER_COMPANY_CODE.equalsIgnoreCase(e.getCarrierName())){
				values.add(e);
			}
		}
		return values;
	}
	/**
	 * 构建发送EMAIL内容的表格
	 * @param list
	 * @return
	 */
	public String buildEmailContent1(List<FreightPriceAlertVO> list){
		StringBuilder builder = new StringBuilder("<table width='100%' border=0>");
		builder.append("<tr>").append("<td>航段</td>").append("<td>航班日期</td>")
					.append("<td>南航最低价</td>").append("<td>代理人最低价</td>").append("<td>差价比例</td>")
					.append("<td>网站名称</td>").append("<td>航班号</td>").append("<td>代理人名称</td><tr>");
		for(FreightPriceAlertVO vo : list){
			builder.append("<tr>")
			.append("<td>").append(vo.getFlightLeg()).append("</td>")
			.append("<td>").append(DateFormatUtils.format(vo.getFlightDate(), "yyyy-MM-dd")).append("</td>")
			.append("<td>").append(NumberUtils.div(vo.getLowerPrice(), 1d, 2)).append("</td>")
			.append("<td>").append(NumberUtils.div(vo.getProxyLowerPrice(), 1d, 2)).append("</td>")
			.append("<td>").append(NumberUtils.div(vo.getSpreadThan(), 1d, 2)+"%").append("</td>")
			.append("<td>").append(vo.getChannelName()).append("</td>")
			.append("<td>").append(vo.getFlightNumber()).append("</td>")
			.append("<td>").append(vo.getProxyName()).append("</td>")
			.append("</tr>");
		}
		builder.append("</table>");
		return builder.toString();
	}
	
	/**
	 * 构建发送EMAIL内容的表格
	 * @param list
	 * @return
	 */
	public String buildEmailContent2(List<FreightPriceAlertVO> list){
		StringBuilder builder = new StringBuilder("<table width='100%' border=0>");
		builder.append("<tr>").append("<td>航段</td>").append("<td>航班日期</td>")
					.append("<td>南航最低价</td>").append("<td>外航公司名称</td>")
					.append("<td>外航公司最低价</td>").append("<td>差价比例</td>")
					.append("<tr>");
		for(FreightPriceAlertVO vo : list){
			builder.append("<tr>")
			.append("<td>").append(vo.getFlightLeg()).append("</td>")
			.append("<td>").append(DateFormatUtils.format(vo.getFlightDate(), "yyyy-MM-dd")).append("</td>")
			.append("<td>").append(NumberUtils.div(vo.getLowerPrice(), 1d, 2)).append("</td>")
			.append("<td>").append(vo.getCarrierName()).append("</td>")
			.append("<td>").append(NumberUtils.div(vo.getProxyLowerPrice(), 1d, 2)).append("</td>")
			.append("<td>").append(NumberUtils.div(vo.getSpreadThan(), 1d, 2)+"%").append("</td>")
			.append("</tr>");
		}
		builder.append("</table>");
		return builder.toString();
	}
	
	/**
	 * 构建发送EMAIL内容的表格
	 * @param list
	 * @return
	 */
	public String buildEmailContent3(List<PlaneInfo> list){
		StringBuilder builder = new StringBuilder("<table width='100%' border=1>");
		builder.append("<tr>")
			   .append("<td>抓取日期</td>").append("<td>航线</td>")
			   .append("<td>航班日期</td>").append("<td>航空公司</td>")
			   .append("<td>最低价</td>")
			   .append("<tr>");
		for(PlaneInfo vo : list){
			//grabDate 20130308100441514 可以转成 年-月-日？
			builder.append("<tr>")
			.append("<td>").append(vo.getGrapDateStr()).append("</td>")
			.append("<td>").append(vo.getFromCityName()+"->"+vo.getToCityName()).append("</td>")
			.append("<td>").append(vo.getFlightBatchDate()).append("</td>")
			.append("<td>").append(vo.getCarrierName()).append("</td>")
			.append("<td>").append(NumberUtils.div(Double.parseDouble(vo.getLowerPrice()), 1d, 0)).append("</td>")
			.append("</tr>");
		}
		builder.append("</table>");
		return builder.toString();
	}
	
	
	
	
	
	
}
